/*global self, pi, postMessage */

/**
 * 解析线程：将二进制数据变成各种结构
 * 消息种类：
 * 1. 解析图片：
 *	{
 *		type: "loadImg",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			data: int, 数据句柄
 *			size: int, 数据的字节数
 *			param: [
 *				["hue", alpha1, alpha2, value],
 *				["bright", alpha1, alpha2, value],
 *				["gray", alpha1, alpha2],
 *				...
 *			]
 *		}
 *	}
 *	返回:
 *	{
 *		type: "loadImg",
 *		id: 代表该请求的唯一数字,
 *		data:
 *			成功{data: 图片句柄, width: 宽度, height: 高度}
 *			失败{error:, reason,}
 *	}
 * --------------------------
 * 2. 解析字体：
 *	{
 *		type: "createFont",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			data: int, 数据句柄
 *			size: int, 数据的字节数
 *			param:
 *		}
 *	}
 *	返回:
 *	{
 *		type: "createFont",
 *		id: 代表该请求的唯一数字,
 *		data: 成功字体句柄，失败{error:, reason,}
 *	}
 * --------------------------
 * 3. 解析网格：
 *	{
 *		type: "createMesh",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			data: int, 数据句柄
 *			size: int, 数据的字节数
 *		}
 *	}
 *	返回:
 *	{
 *		type: "createMesh",
 *		id: 代表该请求的唯一数字,
 *		data: 成功网格句柄, 失败{error:, reason,}
 *	}
 * --------------------------
 * 4. 解析骨骼：
 *	{
 *		type: "createSkeleton",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			data: int, 数据句柄
 *			size: int, 数据的字节数
 *		}
 *	}
 *	返回:
 *	{
 *		type: "createSkeleton",
 *		id: 代表该请求的唯一数字,
 *		data: 成功骨骼句柄，失败{error:, reason,}
 *	}
 * --------------------------
 * 5. 解析天空盒：
 *	{
 *		type: "createSkybox",
 *		id: 代表该请求的唯一数字,
 *	}
 *	返回:
 *	{
 *		type: "createSkybox",
 *		id: 代表该请求的唯一数字,
 *		data: 成功天空盒句柄，失败{error:, reason,}
 *	}
 * --------------------------
 * 6. 解析地形：
 *	{
 *		type: "createTerrain",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			width: int 平坦宽度
 *			depth: int 平坦深度,
 *			posTable: RefResource, 数据句柄, 每个单位的位置数据
 *			sx: float, 宽度每单位代表多少像素
 *			sy: float, 高度每单位代表多少像素
 *			sz: float, 深度每单位代表多少像素
 *		}
 *	}
 *	返回:
 *	{
 *		type: "createTerrain",
 *		id: 代表该请求的唯一数字,
 *		data: 成功地形句柄，失败{error:, reason,}
 *	}
 */
pi.mod.define('pi.worker.parse', function (pi) {
	"use strict";
	var module = {};
	module.init = function () {
		var table = {};

		/* 解析图片 */
		table.loadImg = function (data) {
			var i, r, w, h, len, temp, param, img;
			param = data.param;
			img = pi.render.t3d.loadImg(data.data, data.size);
			if (param !== undefined) {
				param = JSON.parse(param);
			}
			if (img !== 0 && pi.lang.isArray(param)) {
				len = param.length;
				for (i = 0; i < len; i += 1) {
					temp = param[i];
					if (pi.lang.isArray(temp)) {
						if (temp.length === 3 && temp[0] === "hue") {
							pi.render.t3d.hueImg(temp[1], temp[2], temp[3]);
						}
						if (temp.length === 3 && temp[0] === "bright") {
							pi.render.t3d.brightImg(temp[1], temp[2], temp[3]);
						}
						if (temp.length === 2 && temp[0] === "gray") {
							pi.render.t3d.grayImg(temp[1], temp[2]);
						}
					}
				}
			}

			if (img === 0) {
				r = {
					error: 3,
					reason: "parse worker, createImage"
				};
			} else {
				r = {
					data: img,
					width: pi.render.t3d.getImgWidth(img),
					height: pi.render.t3d.getImgHeight(img)
				};
			}
			return r;
		};

		/* 解析字体 */
		table.createFont = function (data) {
			var h = pi.render.t3d.createFont(data.name, data.size, data.param);
			if (h === 0) {
				h = {
					error: 4,
					reason: "parse worker, createFont"
				};
			}
			return h;
		};

		/* 解析网格 */
		table.loadMesh = function (data) {
			var h = pi.render.t3d.loadMesh(data.data, data.size);
			if (h === 0) {
				h = {
					error: 5,
					reason: "parse worker, createMesh"
				};
			}
			return h;
		};

		/* 解析骨骼 */
		table.createSkeleton = function (data) {
			var h = pi.render.t3d.createSkeleton(data.data, data.size);
			if (h === 0) {
				h = {
					error: 6,
					reason: "parse worker, createSkeleton"
				};
			}
			return h;
		};

		/* 解析天空盒 */
		table.createSkybox = function (data) {
			var h = pi.render.t3d.createSkybox();
			if (h === 0) {
				h = {
					error: 7,
					reason: "parse worker, createSkybox"
				};
			}
			return h;
		};

		/* 解析地形 */
		table.createTerrain = function (data) {
			var h = pi.render.t3d.createTerrain(data.width, data.depth, data.posTable.handle, data.sx, data.sy, data.sz);
			if (h === 0) {
				h = {
					error: 8,
					reason: "parse worker, createTerrain"
				};
			}
			return h;
		};
		return table;
	};

	module.onmessage = function (e) {
		var fun, res = 0,
			req = e.data;
		if (req === "quit") {
			self.close();
		} else if (pi.lang.isObject(req)) {
			if (module.methodTable === undefined) {
				module.methodTable = module.init();
			}

			if (module.methodTable && req.type) {
				fun = module.methodTable[req.type];
				if (fun !== undefined) {
					res = fun(req.data);
				} else {
					res = {
						error: 2,
						reason: "parse worker, type isn't function name"
					};
				}
			} else {
				res = {
					error: 1,
					reason: "parse worker, slef.methodTable && req.type"
				};
			}

			postMessage({
				type: req.type,
				id: req.id,
				data: res
			});
		}
	};
	return module;
});